
package kusterordonio.interfaz;

import com.itextpdf.text.*;
import com.itextpdf.text.pdf.*;
import java.awt.image.BufferedImage;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import kusterordonio.dominio.*;
import org.jfree.chart.JFreeChart;
import org.jfree.data.xy.XYSeriesCollection;

public class GeneraPDF {
    
    private SistemaCarne modelo;
    private Ninio ninio;
    private Persona actor;
    private FuncionesAuxiliares funcAux;
    private FuncionesGraficas funcionesG;
    private static String nombreArchivo = "Carné de Salud.pdf";
    private FileOutputStream archivo = new FileOutputStream(nombreArchivo);
    private static Font tituloFont = new Font(Font.FontFamily.HELVETICA, 28,Font.BOLD);
    private static Font capituloFont = new Font(Font.FontFamily.HELVETICA, 18,Font.BOLD);
    private static Font subCapituloFont = new Font(Font.FontFamily.HELVETICA, 16,Font.BOLD);
    private static Font sinDatosFont = new Font(Font.FontFamily.HELVETICA, 14,Font.BOLD);
    private static Font normalFont = new Font(Font.FontFamily.HELVETICA, 12,Font.BOLD);
    private static Font chicaFont = new Font(Font.FontFamily.HELVETICA, 10);
    private static Font masChicaFont = new Font(Font.FontFamily.HELVETICA, 8);
    private int paginas = 0;
    
    public GeneraPDF(SistemaCarne unSistema, Ninio unNinio, Persona unActor, FuncionesAuxiliares unaFunc, FuncionesGraficas unaFuncGraf) throws DocumentException, FileNotFoundException, IOException {
        modelo= unSistema;
        ninio= unNinio;
        actor= unActor;
        funcAux= unaFunc;
        funcionesG= unaFuncGraf;
        crearDocumento();
    }
    
    public void crearDocumento() throws DocumentException, FileNotFoundException, IOException {
        Document documento = new Document(PageSize.A4);
        PdfWriter writer = PdfWriter.getInstance(documento, archivo);
        documento.open();
        agregarMetaData(documento);
        agregarCaratula(documento, writer);
        ficha(documento, writer);
        embarazo(documento, writer);
        parto(documento, writer);
        vacunas(documento, writer);
        controlesSaludHastaDosAnios(documento, writer);
        controlesSaludDesdeDosAnios(documento, writer);
        interconsultas(documento, writer);
        hospitalizacionesEnf(documento, writer);
        saludOcular(documento, writer);
        saludBucal(documento, writer);
        ecografias(documento, writer);
        aptitudFisica(documento, writer);
        notas(documento, writer);
        telefonos(documento, writer);
        graficas(documento, writer);
        documento.close();
    }
    
    private void agregarMetaData(Document documento) {
        documento.addTitle("Carné de Salud");
        documento.addSubject(ninio.toString());
        documento.addAuthor(actor.toString());
        documento.addCreator(actor.toString());
    }

    private void agregarCaratula(Document documento, PdfWriter unWriter)throws DocumentException {
        Paragraph caratula = new Paragraph();
        agregarLineaEnBlanco(caratula, 3);
        Paragraph titulo = new Paragraph("Carné de Salud", tituloFont);
        titulo.setAlignment(Element.ALIGN_CENTER);
        caratula.add(titulo);
        agregarLineaEnBlanco(caratula, 3);
        Paragraph titular = new Paragraph(ninio.toString().toUpperCase(), tituloFont);
        titular.setAlignment(Element.ALIGN_CENTER);
        caratula.add(titular);
        agregarLineaEnBlanco(caratula, 8);
        Paragraph autor = new Paragraph("Reporte generado por: " + actor.toString(), capituloFont);
        autor.setAlignment(Element.ALIGN_CENTER);
        caratula.add(autor);
        caratula.setAlignment(Element.ALIGN_CENTER);
        documento.add(caratula); 
        documento.setPageCount(++paginas);
        documento.newPage();
        
    }

    private void ficha(Document documento, PdfWriter unWriter) throws DocumentException {
        
        String genero = "Ficha del niño";
        if(!ninio.isSexo()) genero = "Ficha de la niña";
        Anchor anchor = new Anchor(genero.toUpperCase(), capituloFont);
        anchor.setLeading(15);
        anchor.setName(genero);

        // Se crea un parrafo que contenga los datos 
        Paragraph ficha = new Paragraph(anchor);
        agregarLineaEnBlanco(ficha, 2);

        String sinD = "Sin datos";
        // Se crea los datos de la ficha del niño y se los agrega al parrafo 
        String nomb = "Este carné pertenece a: "+ ninio.toString().toUpperCase();
        Paragraph nombre = new Paragraph(nomb, normalFont);
        ficha.add(nombre);
        // Se crea un formato para la fecha y se agrega al parrafo
        SimpleDateFormat formatoFecha = new SimpleDateFormat("dd-MM-yyyy");
        Date fecha = ninio.getFechaNac();
        String fechaNac = "Fecha nacimiento: "+ formatoFecha.format(fecha);
        Paragraph fechaNacimiento = new Paragraph(fechaNac, normalFont);
        ficha.add(fechaNacimiento);

        String lugar = "Lugar de nacimiento: ";
        if(!ninio.getLugarNac().equals("")) lugar = lugar+ ninio.getLugarNac();
        else lugar = lugar+sinD;
        Paragraph lugarNac = new Paragraph(lugar, normalFont);
        ficha.add(lugarNac);

        String cedula = "Cedula de identidad: ";
        if(!ninio.getCedulaId().equals("")) cedula = cedula+ ninio.getCedulaId();
        else cedula = cedula+sinD;
        Paragraph cedulaId = new Paragraph(cedula, normalFont);
        ficha.add(cedulaId);

        String dom = "Domicilio: ";
        if(!ninio.getDomiclio().equals("")) dom = dom+ ninio.getDomiclio();
        else dom = dom+sinD;
        Paragraph domicilio = new Paragraph(dom, normalFont);
        ficha.add(domicilio);

        String tel = "Teléfono: ";
        if(!ninio.getTelefono().equals("")) tel = tel+ ninio.getTelefono();
        else tel = tel+sinD;
        Paragraph telefono = new Paragraph(tel, normalFont);
        ficha.add(telefono);

        String serv = "Servicio de salud: ";
        if(!ninio.getServicioSalud().equals("")) serv = serv+ ninio.getServicioSalud();
        else serv = serv+sinD;
        Paragraph servicio = new Paragraph(serv, normalFont);
        ficha.add(servicio);

        String idServ = "Nº de identificación en el servicio: ";
        if(!ninio.getIdEnServicio().equals("")) idServ = idServ+ ninio.getIdEnServicio();
        else idServ = idServ+sinD;
        Paragraph idServicio = new Paragraph(idServ, normalFont);
        ficha.add(idServicio);
        agregarLineaEnBlanco(ficha, 2);
        // Se crea un parrafo para contener los detos de la madre
        Paragraph tituloM = new Paragraph("Datos de la madre", subCapituloFont);
        tituloM.setAlignment(Element.ALIGN_CENTER);
        ficha.add(tituloM);
        agregarLineaEnBlanco(ficha, 1);
        if(ninio.getMadre() != null){
            String nombM = "Nombre: ";
            if(!ninio.getMadre().toString().equals("")) nombM = nombM+ ninio.getMadre().toString();
            else nombM = idServ+sinD;
            Paragraph nombreM = new Paragraph(nombM, normalFont);
            ficha.add(nombreM);

            if(ninio.getMadre().getFechaNac() != null){
                Date fechaM = ninio.getMadre().getFechaNac();
                String fechaNacM = "Fecha nacimiento: "+ formatoFecha.format(fechaM);
                Paragraph fechaNacimientoM = new Paragraph(fechaNacM, normalFont);
                ficha.add(fechaNacimientoM);
            }else{
                String sinDM = "Fecha de nacimiento: "+sinD;
                Paragraph sinM = new Paragraph(sinDM, normalFont);
                ficha.add(sinM);
            }

            String lugarM = "Lugar de nacimiento: ";
            if(!ninio.getMadre().getLugarNac().equals("")) lugarM = lugarM+ ninio.getMadre().getLugarNac();
            else lugarM = lugarM+sinD;
            Paragraph lugarNacM = new Paragraph(lugarM, normalFont);
            ficha.add(lugarNacM);

            String cedulaM = "Cedula de identidad: ";
            if(!ninio.getMadre().getCedulaId().equals("")) cedulaM = cedulaM+ ninio.getMadre().getCedulaId();
            else cedulaM = cedulaM+sinD;
            Paragraph cedulaIdM = new Paragraph(cedulaM, normalFont);
            ficha.add(cedulaIdM);
        }else{
            String sinDM = "Sin datos";
            Paragraph sinM = new Paragraph(sinDM, sinDatosFont);
            ficha.add(sinM);
        }
        agregarLineaEnBlanco(ficha, 2);
        // Se crea un parrafo para contener los datos del padre
        Paragraph tituloP = new Paragraph("Datos del padre", subCapituloFont);
        tituloP.setAlignment(Element.ALIGN_CENTER);
        ficha.add(tituloP);
        agregarLineaEnBlanco(ficha, 1);
        if(ninio.getPadre() != null){
            String nombP = "Nombre: ";
            if(!ninio.getPadre().toString().equals("")) nombP = nombP+ ninio.getPadre().toString();
            else nombP = nombP+sinD;
            Paragraph nombreP = new Paragraph(nombP, normalFont);
            ficha.add(nombreP);

            if(ninio.getPadre().getFechaNac() != null){
                Date fechaP = ninio.getPadre().getFechaNac();
                String fechaNacP = "Fecha nacimiento: "+ formatoFecha.format(fechaP);
                Paragraph fechaNacimientoP = new Paragraph(fechaNacP, normalFont);
                ficha.add(fechaNacimientoP);
            }else{
                String sinDP = "Fecha de nacimiento: ";
                Paragraph sinP = new Paragraph(sinDP, capituloFont);
                ficha.add(sinP);
            }

            String lugarP = "Lugar de nacimiento: ";
            if(!ninio.getPadre().getLugarNac().equals("")) lugarP = lugarP+ ninio.getPadre().getLugarNac();
            else lugarP = lugarP+sinD;
            Paragraph lugarNacP = new Paragraph(lugarP, normalFont);
            ficha.add(lugarNacP);

            String cedulaP = "Cedula de identidad: ";
            if(!ninio.getPadre().getCedulaId().equals("")) cedulaP = cedulaP+ ninio.getPadre().getCedulaId();
            else cedulaP = cedulaP+sinD;
            Paragraph cedulaIdP = new Paragraph(cedulaP, normalFont);
            ficha.add(cedulaIdP);
        }else{
            String sinDP = "Sin datos ";
            Paragraph sinP = new Paragraph(sinDP, sinDatosFont);
            ficha.add(sinP);
        }
        agregarLineaEnBlanco(ficha, 2);
        // Se crea un parrafo para contener los datos del tutor
        Paragraph tituloT = new Paragraph("Datos del Tutor", subCapituloFont);
        tituloT.setAlignment(Element.ALIGN_CENTER);
        ficha.add(tituloT);
        agregarLineaEnBlanco(ficha, 1);
        if(ninio.getTutor() != null){
            String nombT = "Nombre: ";
            if(!ninio.getTutor().toString().equals("")) nombT = nombT+ ninio.getTutor().toString();
            else nombT = nombT+sinD;
            Paragraph nombreT = new Paragraph(nombT, normalFont);
            ficha.add(nombreT);

            if(ninio.getTutor().getFechaNac() != null){
            Date fechaT = ninio.getTutor().getFechaNac();
            String fechaNacT = "Fecha nacimiento: "+ formatoFecha.format(fechaT);
            Paragraph fechaNacimientoT = new Paragraph(fechaNacT, normalFont);
            ficha.add(fechaNacimientoT);
            }else{
                String sinDT = "Fecha de nacimiento: ";
                Paragraph sinT = new Paragraph(sinDT, capituloFont);
                ficha.add(sinT);
            }

            String lugarT = "Lugar de nacimiento: ";
            if(!ninio.getTutor().getLugarNac().equals("")) lugarT = lugarT+ ninio.getTutor().getLugarNac();
            else lugarT = lugarT+sinD;
            Paragraph lugarNacT = new Paragraph(lugarT, normalFont);
            ficha.add(lugarNacT);

            String cedulaT = "Cedula de identidad: ";
            if(!ninio.getTutor().getCedulaId().equals("")) cedulaT = cedulaT+ ninio.getTutor().getLugarNac();
            else cedulaT = cedulaT+sinD;
            Paragraph cedulaIdT = new Paragraph(cedulaT, normalFont);
            ficha.add(cedulaIdT);
        }else{
            String sinDT = "Sin datos";
            Paragraph sinT = new Paragraph(sinDT, sinDatosFont);
            ficha.add(sinT);
        }
        // Se le da una alineación al parrafo
        ficha.setAlignment(Element.ALIGN_LEFT);
        ficha.setIndentationLeft(50);
        // Se crea un capitulo y se le agrega el parrafo
        Chapter chap= new Chapter(ficha, 1);
        // Se agrega el capitulo al documento
        documento.add(chap);
        documento.setPageCount(++paginas);
        finDePagina(unWriter, documento);
        documento.newPage();

    }

    private void embarazo(Document documento, PdfWriter unWriter) throws DocumentException {

        Anchor anchor = new Anchor("EMBARAZO", capituloFont);
        anchor.setLeading(15);
        anchor.setName("Embarazo");

        // Se crea un parrafo que contenga los datos 
        Paragraph embarazo = new Paragraph(anchor);
        agregarLineaEnBlanco(embarazo, 2);

        String sinD = "Sin datos";
        // Se crea los datos y se los agrega al parrafo 
        String num = "Número de embarazo: ";
        if(ninio.getCarne().getEmbarazo().getNumero() != 0) num = num+ ninio.getCarne().getEmbarazo().getNumero();
        else num = num+sinD; 
        Paragraph numero = new Paragraph(num, normalFont);
        embarazo.add(numero);
        
        String numCon = "Número de controles prenatales: ";
        if(ninio.getCarne().getEmbarazo().getCantControles() != -1) numCon = numCon+ ninio.getCarne().getEmbarazo().getCantControles();
        else numCon = numCon+sinD; 
        Paragraph numeroControles = new Paragraph(numCon, normalFont);
        embarazo.add(numeroControles);

        String unic = "Embrazo multiple: ";
        String datoE = funcAux.muestraDatoDelControl(ninio.getCarne().getEmbarazo().isMultiple(), ninio.getCarne().getEmbarazo().isUnico(), 1);
        unic= unic+datoE;
        Paragraph unico = new Paragraph(unic, normalFont);
        embarazo.add(unico);

        String v = "VDRL: ";
        String datoV = funcAux.muestraDatoDelControl(ninio.getCarne().getEmbarazo().isVdrlMas(), ninio.getCarne().getEmbarazo().isVdrlMenos(), 2);
        if(!ninio.getCarne().getEmbarazo().getTratamiento().equals("")){
            String trat = "Tratamiento: "+ ninio.getCarne().getEmbarazo().getTratamiento();
            v = v+datoV+"          "+trat;
        }else v = v+datoV;
        Paragraph vdrl = new Paragraph(v, normalFont);
        embarazo.add(vdrl);

        String grupo = "Grupo sanguíneo: ";
        if(!ninio.getCarne().getEmbarazo().getGrupoSanguineo().equals(" ")) grupo = grupo+ ninio.getCarne().getEmbarazo().getGrupoSanguineo();
        else grupo = grupo+sinD;
        Paragraph grupoSangineo = new Paragraph(grupo, normalFont);
        embarazo.add(grupoSangineo);

        String tipo = "RH: ";
        String rh= funcAux.muestraDatoDelControl(ninio.getCarne().getEmbarazo().isRhPos(), ninio.getCarne().getEmbarazo().isRhNeg(), 2);
        tipo= tipo+rh;
        Paragraph tipoSangineo = new Paragraph(tipo, normalFont);
        embarazo.add(tipoSangineo);

        String part = "Parto: ";
        if(ninio.getCarne().getEmbarazo().isEspontaneo() || ninio.getCarne().getEmbarazo().isForceps()
                || ninio.getCarne().getEmbarazo().isCesarea()){
            String p = "";
            if(ninio.getCarne().getEmbarazo().isEspontaneo()) p = "Espontáneo";
            if(ninio.getCarne().getEmbarazo().isForceps()) p = "Fórceps";
            if(ninio.getCarne().getEmbarazo().isCesarea()) p = "Cesárea";
            part = part+ p;
        }else part = part+sinD;
        Paragraph parto = new Paragraph(part, normalFont);
        embarazo.add(parto);

        String loc = "Locación del parto: ";
        if(ninio.getCarne().getEmbarazo().isInstitucional() || ninio.getCarne().getEmbarazo().isEnDomicilio()){
            String l = "";
            if(ninio.getCarne().getEmbarazo().isInstitucional()) l = "En institución de salud";
            if(ninio.getCarne().getEmbarazo().isEnDomicilio()) l = "En domicilio/Otro";
            loc = loc+ l;
        }
        else loc = loc+sinD;
        Paragraph locacion = new Paragraph(loc, normalFont);
        embarazo.add(locacion);

        String patEmb = "Patología en embarazo: ";
        String pe = funcAux.muestraDatoDelControl(ninio.getCarne().getEmbarazo().isPatEmbarazoSi(), ninio.getCarne().getEmbarazo().isPatEmbarazoNo(), 1);
        if(!ninio.getCarne().getEmbarazo().getPatologiaEmbarazo().equals("")){
            String patE = ninio.getCarne().getEmbarazo().getPatologiaEmbarazo();
            patEmb = patEmb+pe+"          Cual: "+patE;
        }else patEmb = patEmb+pe;
        Paragraph patologiaE = new Paragraph(patEmb, normalFont);
        embarazo.add(patologiaE);

        String patPar = "Patología en parto: ";
        String pp = funcAux.muestraDatoDelControl(ninio.getCarne().getEmbarazo().isPatPartoSi(), ninio.getCarne().getEmbarazo().isPatPartoNo(), 1);
        if(!ninio.getCarne().getEmbarazo().getPatologiaParto().equals("")){
            String patP = ninio.getCarne().getEmbarazo().getPatologiaParto();
            patPar = patPar+pp+"          Cual: "+patP;
        }else patPar = patPar+pp;
        Paragraph patologiaP = new Paragraph(patPar, normalFont);
        embarazo.add(patologiaP);

        String patPuer = "Patología en puerperio: ";
        String pu = funcAux.muestraDatoDelControl(ninio.getCarne().getEmbarazo().isPatPuerperioSi(), ninio.getCarne().getEmbarazo().isPatPuerperioNo(), 1);
        if(!ninio.getCarne().getEmbarazo().getPatologiaPuerperio().equals("")){
            String patPu = ninio.getCarne().getEmbarazo().getPatologiaPuerperio();
            patPuer = patPuer+pu+"          Cual: "+patPu;
        }else patPuer = patPuer+pu;
        Paragraph patologiaPuer = new Paragraph(patPuer, normalFont);
        embarazo.add(patologiaPuer);

        embarazo.setAlignment(Element.ALIGN_LEFT);
        embarazo.setIndentationLeft(50);
        Chapter chap= new Chapter(embarazo, 2);
        
        documento.add(chap);
        documento.setPageCount(++paginas);
        finDePagina(unWriter, documento);

    }

    private void parto(Document documento, PdfWriter unWriter) throws DocumentException {

        RecienNacido recien = ninio.getCarne().getRecienNacido();

        Anchor anchor = new Anchor("RECIEN NACIDO", capituloFont);
        anchor.setLeading(15);
        anchor.setName("Recien nacido");

        // Se crea un parrafo que contenga los datos 
        Paragraph parto = new Paragraph(anchor);
        agregarLineaEnBlanco(parto, 2);

        String sinDatos = "Sin datos";

        String peso = "Peso: ";
        if (recien.getPeso()==0) peso = peso + sinDatos;
        else peso = peso + recien.getPeso() + "gr.";
        Paragraph pesoRn = new Paragraph(peso, normalFont);
        parto.add(pesoRn);

        String talla = "Talla: ";
        if (recien.getTalla()==0) talla = talla + sinDatos;
        else talla = talla + recien.getTalla() + "cm.";
        Paragraph tallaRn = new Paragraph(talla, normalFont);
        parto.add(tallaRn);

        String perimCef = "Perímetro cefálico: ";
        if (recien.getPerimCefalico()==0) perimCef = perimCef + sinDatos;
        else perimCef = perimCef + recien.getPerimCefalico() + "cm.";
        Paragraph perimCefRn = new Paragraph(perimCef, normalFont);
        parto.add(perimCefRn);

        String edadGest = "Edad gestacional: ";
        if (recien.getEdadGest()==0) edadGest = edadGest + sinDatos;
        else edadGest = edadGest + recien.getEdadGest() + " semanas";
        Paragraph edadGestRn = new Paragraph(edadGest, normalFont);
        parto.add(edadGestRn);

        String apgar = "Apgar 1°: ";
        if (recien.getApgar1()==0) apgar = apgar + sinDatos;
        else apgar = apgar + recien.getApgar1();
        apgar = apgar + "   5°: ";
        if (recien.getApgar5()==0) apgar = apgar + sinDatos;
        else apgar = apgar + recien.getApgar5();
        Paragraph apgarRn = new Paragraph(apgar, normalFont);
        parto.add(apgarRn);

        String reanima = "Reanimación: ";
        reanima = reanima+funcAux.muestraDatoDelControl(recien.isReanimacionPos(), recien.isReanimacionNeg(), 1);
        Paragraph reanimaRn = new Paragraph(reanima, normalFont);
        parto.add(reanimaRn);

        String grupo = "Grupo Sanguíneo: ";
        if (recien.getGrupo().equals(" ")) grupo = grupo + sinDatos;
        else grupo = grupo + recien.getGrupo();
        Paragraph grupoRn = new Paragraph(grupo, normalFont);
        parto.add(grupoRn);

        String rh = "RH: ";
        rh = rh+funcAux.muestraDatoDelControl(recien.isRhMas(), recien.isRhMenos(), 2);
        Paragraph rhRn = new Paragraph(rh, normalFont);
        parto.add(rhRn);

        String coombs = "COOMBS: ";
        coombs = coombs+funcAux.muestraDatoDelControl(recien.isCoombsPos(), recien.isCoombsNeg(), 2);
        Paragraph coombsRn = new Paragraph(coombs, normalFont);
        parto.add(coombsRn);

        String vdrl = "VDRL: ";
        vdrl = vdrl+funcAux.muestraDatoDelControl(recien.isVdrlPos(), recien.isVdrlNeg(), 2);
        Paragraph vdrlRn = new Paragraph(vdrl, normalFont);
        parto.add(vdrlRn);
        agregarLineaEnBlanco(parto, 2);

        String pesquisa = "Pesquisa neonatal";
        Paragraph pesquisaRn = new Paragraph(pesquisa, subCapituloFont);
        parto.add(pesquisaRn);
        agregarLineaEnBlanco(parto, 1);

        String tsh = "TSH: ";
        if (recien.getTsh()==0) tsh = tsh + sinDatos;
        else tsh = tsh + recien.getTsh() + "mUL/L";
        Paragraph tshRn = new Paragraph(tsh, normalFont);
        parto.add(tshRn);

        String fenil = "Fenilalanina: ";
        if (recien.getFenilalanina()==0) fenil = fenil + sinDatos;
        else fenil = fenil + recien.getFenilalanina() + "mg/dL";
        Paragraph fenilRn = new Paragraph(fenil, normalFont);
        parto.add(fenilRn);

        String ohp = "OHP-17: ";
        if (recien.getOhp17()==0) ohp = ohp + sinDatos;
        else ohp = ohp + recien.getOhp17() + "ng/dL";
        Paragraph ohpRn = new Paragraph(ohp, normalFont);
        parto.add(ohpRn);

        String audi = "Auditivo: ";
        audi = audi+funcAux.muestraDatoDelControl(recien.isAuditivoPos(), recien.isAuditivoNeg(), 1);
        Paragraph audiRn = new Paragraph(audi, normalFont);
        parto.add(audiRn);

        String otras = "Otras: ";
        if (recien.getOtras().equals("")) otras = otras + sinDatos;
        else otras = otras + recien.getOtras();
        Paragraph otrasRn = new Paragraph(otras, normalFont);
        parto.add(otrasRn);

        String anomalia = "Anomalías y malformaciones: ";
        if (recien.getAnomalias().equals("")) anomalia = anomalia + sinDatos;
        else anomalia = anomalia + recien.getAnomalias();
        Paragraph anomaliaRn = new Paragraph(anomalia, normalFont);
        parto.add(anomaliaRn);

        String patologia = "Patología: ";
        if (recien.getPatologia().equals("")) patologia = patologia + sinDatos;
        else patologia = patologia + recien.getPatologia();
        Paragraph patologiaRn = new Paragraph(patologia, normalFont);
        parto.add(patologiaRn);

        String pesoEg = "Peso egreso: ";
        if (recien.getPesoEgreso()==0) pesoEg = pesoEg + sinDatos;
        else pesoEg = pesoEg + recien.getPesoEgreso() + "gr.";
        Paragraph pesoEgRn = new Paragraph(pesoEg, normalFont);
        parto.add(pesoEgRn);
        agregarLineaEnBlanco(parto, 2);

        String alimenta = "Alimentación al alta";
        Paragraph alimentaRn = new Paragraph(alimenta, subCapituloFont);
        parto.add(alimentaRn);
        agregarLineaEnBlanco(parto, 1);

        String alimentacion = "";
        if (!recien.isLactanciaExc()&&!recien.isArtificial()&&!recien.isMixta()) alimentacion = alimentacion + sinDatos;
        if (recien.isLactanciaExc()) alimentacion = alimentacion + "Lactancia exclusiva";
        if (recien.isArtificial()) alimentacion = alimentacion + "Artificial";
        if (recien.isMixta()) alimentacion = alimentacion + "Mixta";
        Paragraph alimentacionRn = new Paragraph(alimentacion, normalFont);
        parto.add(alimentacionRn);
        agregarLineaEnBlanco(parto, 1);

        String fechaEg = "Fecha de egreso: ";
        if(recien.getFechaEgreso() != null){
            SimpleDateFormat formatoFecha = new SimpleDateFormat("dd-MM-yyyy");
            fechaEg = fechaEg+ formatoFecha.format(recien.getFechaEgreso());
        }
        else fechaEg = fechaEg + sinDatos;
        Paragraph fechaEgRn = new Paragraph(fechaEg, normalFont);
        parto.add(fechaEgRn);

        parto.setAlignment(Element.ALIGN_LEFT);
        parto.setIndentationLeft(50);
        Chapter chap= new Chapter(parto, 3);
        documento.add(chap);
        documento.setPageCount(++paginas);
        finDePagina(unWriter, documento);
        documento.newPage();
    }

    private void telefonos(Document documento, PdfWriter unWriter) throws DocumentException {
        
        Anchor anchor = new Anchor("TELEFONOS IMPORTANTES", capituloFont);
        anchor.setLeading(20);
        anchor.setName("Telefonos importantes");

        Paragraph tel = new Paragraph(anchor);

        /*Paragraph titulo = new Paragraph(anchor);
        titulo.setAlignment(Element.ALIGN_CENTER);
        tel.add(titulo);*/
        agregarLineaEnBlanco(tel, 2);

        Paragraph eme = new Paragraph("- Emergencias 911", subCapituloFont);
        tel.add(eme);
        Paragraph intox = new Paragraph("- Intoxicaciones (CIAT) 1722", subCapituloFont);
        tel.add(intox);
        Paragraph azul = new Paragraph("- Línea azul (INAU) 08005050", subCapituloFont);
        tel.add(azul);
        Paragraph bomberos = new Paragraph("- Bomberos 104", subCapituloFont);
        tel.add(bomberos);
        Paragraph jefatura = new Paragraph("- Jefatura 1909", subCapituloFont);
        tel.add(jefatura);
        Paragraph apoyo = new Paragraph("- Apoyo a la mujer víctima de la violencia 08004141", subCapituloFont);
        tel.add(apoyo);
        agregarLineaEnBlanco(tel, 1);

        Paragraph otros = new Paragraph("Otros teléfonos importantes", subCapituloFont);
        tel.add(otros);
        String uno = ninio.getCarne().getTelefImportantes()[0];
        String dos = ninio.getCarne().getTelefImportantes()[1];
        String tres = ninio.getCarne().getTelefImportantes()[2];
        String cuatro = ninio.getCarne().getTelefImportantes()[3];
        String cinco = ninio.getCarne().getTelefImportantes()[4];
        if(uno.equals("")&&dos.equals("")&&tres.equals("")&&cuatro.equals("")&&cinco.equals("")){
            Paragraph sinT = new Paragraph("- Sin datos", subCapituloFont);
            tel.add(sinT);
        }
        if(!uno.equals("")){
            Paragraph unT = new Paragraph("- " + uno, subCapituloFont);
            tel.add(unT);
        }
        if(!dos.equals("")){
            Paragraph dosT = new Paragraph("- " + dos, subCapituloFont);
            tel.add(dosT);
        }
        if(!tres.equals("")){
            Paragraph tresT = new Paragraph("- " + tres, subCapituloFont);
            tel.add(tresT);
        }
        if(!cuatro.equals("")){
            Paragraph cuatroT = new Paragraph("- " + cuatro, subCapituloFont);
            tel.add(cuatroT);
        }
        if(!cinco.equals("")){
            Paragraph cincoT = new Paragraph("- " + cinco, subCapituloFont);
            tel.add(cincoT);
        }
        tel.setAlignment(Element.ALIGN_LEFT);
        tel.setIndentationLeft(50);
        Chapter chap = new Chapter(tel, 14);
        documento.add(chap);
        documento.setPageCount(++paginas);
        finDePagina(unWriter, documento);
        documento.newPage();

    }
    
    private void aptitudFisica (Document documento, PdfWriter unWriter) throws DocumentException{
        
        Anchor anchorAp = new Anchor("APTITUD FISICA", capituloFont);
        anchorAp.setLeading(15);
        anchorAp.setName("APTITUD FISICA");
        Paragraph apt = new Paragraph(anchorAp);
        agregarLineaEnBlanco(apt, 1);

        if(!ninio.getCarne().esVaciaAptitudFisica()){
            ArrayList<AptitudFisica> lista = ninio.getCarne().getAptitudFisica();
            PdfPTable tabla = new PdfPTable (new float [] {1.1f, 1.5f, 0.6f, 2.3f, 1.2f, 1.7f});
            tabla.setWidthPercentage (90.0f);
            agregarCeldaTitCentColor(tabla, "Fecha");
            agregarCeldaTitCentColor(tabla, "Edad");
            agregarCeldaTitCentColor(tabla, "Apto");
            agregarCeldaTitCentColor(tabla, "Observaciones");
            agregarCeldaTitCentColor(tabla, "Valido Hasta");
            agregarCeldaTitCentColor(tabla, "Medico");
            SimpleDateFormat formatoFecha = new SimpleDateFormat("dd/MM/yyyy");
            for(int i = 0; i<lista.size()&&i<=15; i++){
                agregarCeldaDatoCentColor(tabla, formatoFecha.format(lista.get(i).getFecha()));
                agregarCeldaDatoCentColor(tabla, funcAux.muestraEdad(lista.get(i).getEdad()));
                agregarCeldaDatoCentColor(tabla, "Si");
                agregarCeldaDatoCentColor(tabla, lista.get(i).getObservaciones());
                agregarCeldaDatoCentColor(tabla, formatoFecha.format(lista.get(i).getHasta()));
                agregarCeldaDatoCentColor(tabla, lista.get(i).getPediatra().toString());
            }
            apt.add(tabla);
            agregarLineaEnBlanco(apt, 1);
            if(lista.size()> 15){
                Paragraph nota = new Paragraph("Por razones de espacio, se muestran hasta 15 controles", normalFont);
                apt.add(nota);
                Paragraph nota2 = new Paragraph("Para ver la lista completa de controles acceda a la versión digital del carné", normalFont);
                apt.add(nota2);
            }
        }else{
            agregarLineaEnBlanco(apt, 1);
            Paragraph nota = new Paragraph("No se han anotado controles de aptitud fisíca", sinDatosFont);
            apt.add(nota);
        }
        apt.setAlignment(Element.ALIGN_LEFT);
        apt.setIndentationLeft(50);

        Chapter chap= new Chapter(apt, 12);
        documento.add(chap);
        documento.setPageCount(++paginas);
        finDePagina(unWriter, documento);
        documento.newPage();
    }

    public void vacunas(Document documento, PdfWriter unWriter)throws DocumentException{

        Anchor anchor = new Anchor("VACUNAS", capituloFont);
        anchor.setLeading(20);
        anchor.setName("Vacunas");

        Paragraph vacunas = new Paragraph(anchor);
        agregarLineaEnBlanco(vacunas, 2);

        Paragraph subTitulo1 = new Paragraph("Lista de vacunas obligatorias", subCapituloFont);
        vacunas.add(subTitulo1);
        
        //tabla fila superior vacunas obligatorias
        PdfPTable filaSup = new PdfPTable (new float [] {3.0f,5.0f,1.75f});
        filaSup.setWidthPercentage (90.0f);
        agregarCeldaTitIzqColor(filaSup,"Vacunas obligatorias");
        agregarCeldaTitCentColor(filaSup, "Edad en meses");
        agregarCeldaTitCentColor(filaSup, "Edad en años");
        filaSup.setHorizontalAlignment(0);
        vacunas.add(filaSup);
        //tabla vacunas obligatorias
        boolean[] vacs = ninio.getCarne().getVacunas().getVacunasObli();
        String ok = "ok";
        PdfPTable tablaVac = new PdfPTable (new float [] {3.0f,0.5f,0.5f,0.5f,0.5f,0.5f,0.5f,0.5f,0.5f,0.5f,0.5f,0.5f,0.5f,0.75f});
        tablaVac.setWidthPercentage (90.0f);
        agregarCeldaDatoCentColor(tablaVac,"");
        agregarCeldaTitCentColor(tablaVac,"0");
        agregarCeldaTitCentColor(tablaVac,"1");
        agregarCeldaTitCentColor(tablaVac,"2");
        agregarCeldaTitCentColor(tablaVac,"3");
        agregarCeldaTitCentColor(tablaVac,"4");
        agregarCeldaTitCentColor(tablaVac,"5");
        agregarCeldaTitCentColor(tablaVac,"6");
        agregarCeldaTitCentColor(tablaVac,"12");
        agregarCeldaTitCentColor(tablaVac,"15");
        agregarCeldaTitCentColor(tablaVac,"21");
        agregarCeldaTitCentColor(tablaVac,"5");
        agregarCeldaTitCentColor(tablaVac,"12");
        agregarCeldaTitCentColor(tablaVac,"c/10");
        agregarCeldaTitIzqColor(tablaVac,"BCG");
        agregarCeldaTablaVacunas(tablaVac,ok,vacs[0]);
        agregarCeldasVaciasATabla(tablaVac, 12);
        agregarCeldaTitIzqColor(tablaVac,"Pentavalente (*)");
        agregarCeldasVaciasATabla(tablaVac, 2);
        agregarCeldaTablaVacunas(tablaVac,ok,vacs[1]);
        agregarCeldasVaciasATabla(tablaVac, 1);
        agregarCeldaTablaVacunas(tablaVac,ok,vacs[2]);
        agregarCeldasVaciasATabla(tablaVac, 1);
        agregarCeldaTablaVacunas(tablaVac,ok,vacs[3]);
        agregarCeldasVaciasATabla(tablaVac, 1);
        agregarCeldaTablaVacunas(tablaVac,ok,vacs[4]);
        agregarCeldasVaciasATabla(tablaVac, 4);
        agregarCeldaTitIzqColor(tablaVac,"Triple bacteriana (**)");
        agregarCeldasVaciasATabla(tablaVac, 10);
        agregarCeldaTablaVacunas(tablaVac,ok,vacs[5]);
        agregarCeldasVaciasATabla(tablaVac, 2);
        agregarCeldaTitIzqColor(tablaVac,"Polio OPV");
        agregarCeldasVaciasATabla(tablaVac, 2);
        agregarCeldaTablaVacunas(tablaVac,ok,vacs[6]);
        agregarCeldasVaciasATabla(tablaVac, 1);
        agregarCeldaTablaVacunas(tablaVac,ok,vacs[7]);
        agregarCeldasVaciasATabla(tablaVac, 1);
        agregarCeldaTablaVacunas(tablaVac,ok,vacs[8]);
        agregarCeldaTablaVacunas(tablaVac,ok,vacs[9]);
        agregarCeldasVaciasATabla(tablaVac, 5);
        agregarCeldaTitIzqColor(tablaVac,"Neumococo C 7 V");
        agregarCeldasVaciasATabla(tablaVac, 2);
        agregarCeldaTablaVacunas(tablaVac,ok,vacs[10]);
        agregarCeldasVaciasATabla(tablaVac, 1);
        agregarCeldaTablaVacunas(tablaVac,ok,vacs[11]);
        agregarCeldasVaciasATabla(tablaVac, 2);
        agregarCeldaTablaVacunas(tablaVac,ok,vacs[12]);
        agregarCeldasVaciasATabla(tablaVac, 5);
        agregarCeldaTitIzqColor(tablaVac,"Triple viral");
        agregarCeldasVaciasATabla(tablaVac, 7);
        agregarCeldaTablaVacunas(tablaVac,ok,vacs[13]);
        agregarCeldasVaciasATabla(tablaVac, 2);
        agregarCeldaTablaVacunas(tablaVac,ok,vacs[14]);
        agregarCeldasVaciasATabla(tablaVac, 2);
        agregarCeldaTitIzqColor(tablaVac,"Varicela");
        agregarCeldasVaciasATabla(tablaVac, 7);
        agregarCeldaTablaVacunas(tablaVac,ok,vacs[15]);
        agregarCeldasVaciasATabla(tablaVac, 5);
        agregarCeldaTitIzqColor(tablaVac,"Hepatitis A");
        agregarCeldasVaciasATabla(tablaVac, 8);
        agregarCeldaTablaVacunas(tablaVac,ok,vacs[16]);
        agregarCeldaTablaVacunas(tablaVac,ok,vacs[17]);
        agregarCeldasVaciasATabla(tablaVac, 3);
        agregarCeldaTitIzqColor(tablaVac,"Doble bacteriana (***)(1)");
        agregarCeldasVaciasATabla(tablaVac, 11);
        agregarCeldaTablaVacunas(tablaVac,ok,vacs[18]);
        agregarCeldaTablaVacunas(tablaVac,ok,vacs[19]);
        agregarCeldaTitIzqColor(tablaVac,"Hepatitis B");
        agregarCeldasVaciasATabla(tablaVac, 11);
        agregarCeldaTablaVacunas(tablaVac,ok,vacs[20]);
        agregarCeldasVaciasATabla(tablaVac, 1);
        tablaVac.setHorizontalAlignment(0);
        vacunas.add(tablaVac);
        agregarLineaEnBlanco(vacunas, 1);

        Paragraph subTitulo2 = new Paragraph("Otras Vacunas", subCapituloFont);
        vacunas.add(subTitulo2);
        
        // Vacunas no sistematicas
        // Crea tabla para desplegar los datos
        PdfPTable tabla = new PdfPTable (new float [] {2.5f, 1.5f, 1.5f});
        tabla.setWidthPercentage (90.0f);
        agregarCeldaTitCentColor(tabla,"Vacunas no sistemáticas");
        agregarCeldaTitCentColor(tabla,"Fecha");
        agregarCeldaTitCentColor(tabla,"Edad");
        
        SimpleDateFormat formatoFecha = new SimpleDateFormat("dd/MM/yyyy");
        Vacunas vac = ninio.getCarne().getVacunas();
        // Se cargan los datos
        agregarCeldaTitIzqColor(tabla,"Antigripal");
        if(vac.getFechaAntigripal() != null){
            agregarCeldaDatoCentColor(tabla,(formatoFecha.format(vac.getFechaAntigripal())));
        }else{
            agregarCeldaDatoCentColor(tabla,"Sin datos");
        }
        
        agregarCeldaDatoCentColor(tabla,funcAux.muestraEdad(vac.getEdadAntigripal()));
                
        agregarCeldaTitIzqColor(tabla,"Anti - Meningococo B");
        if(vac.getFechaAntiMeningB() != null){
            agregarCeldaDatoCentColor(tabla,formatoFecha.format(vac.getFechaAntiMeningB()));
        }else{
            agregarCeldaDatoCentColor(tabla,"Sin datos");
        }
        agregarCeldaDatoCentColor(tabla,funcAux.muestraEdad(vac.getEdadAntiMeningB()));
        
        agregarCeldaTitIzqColor(tabla,"Otras");
        
        if(vac.getFechaOtras() != null){
            agregarCeldaDatoCentColor(tabla,formatoFecha.format(vac.getFechaOtras()));
        }else{
            agregarCeldaDatoCentColor(tabla,"Sin datos");
        }
        agregarCeldaDatoCentColor(tabla,funcAux.muestraEdad(vac.getEdadOtras()));
        tabla.setHorizontalAlignment(0);
        vacunas.add(tabla);

        vacunas.setAlignment(Element.ALIGN_LEFT);
        vacunas.setIndentationLeft(50);
        Chapter chap= new Chapter(vacunas, 4);
        documento.add(chap);
        documento.setPageCount(++paginas);
        finDePagina(unWriter, documento);
        documento.newPage();
    }

    public void saludOcular(Document documento, PdfWriter unWriter)throws DocumentException{
        Anchor anchor = new Anchor("SALUD OCULAR", capituloFont);
        anchor.setLeading(15);
        anchor.setName("Salud ocular");
        Paragraph saludOcular = new Paragraph(anchor);
        agregarLineaEnBlanco(saludOcular, 2);

        boolean[] saludOc = ninio.getCarne().getSaludOcular().getControles();
        // Se crea una tabla para los datos
        PdfPTable tabla = new PdfPTable (new float [] {1.5f, 2.0f, 2.0f});
        tabla.setWidthPercentage (90.0f);
        agregarCeldaTitCentColor(tabla,"Edad (años)");
        agregarCeldaTitCentColor(tabla,"Con corrección OJO DERECHO");
        agregarCeldaTitCentColor(tabla,"Con corrección OJO IZQUIERDO");
        agregarCeldaTitCentColor(tabla,"3");
        agregarCeldaDatoCentColor(tabla,funcAux.muestraDatoDelControl(saludOc[0], saludOc[1], 1));
        agregarCeldaDatoCentColor(tabla,funcAux.muestraDatoDelControl(saludOc[6], saludOc[7], 1));
        agregarCeldaTitCentColor(tabla,"5");
        agregarCeldaDatoCentColor(tabla,funcAux.muestraDatoDelControl(saludOc[2], saludOc[3], 1));
        agregarCeldaDatoCentColor(tabla,funcAux.muestraDatoDelControl(saludOc[8], saludOc[9], 1));
        agregarCeldaTitCentColor(tabla,"12");
        agregarCeldaDatoCentColor(tabla,funcAux.muestraDatoDelControl(saludOc[4], saludOc[5], 1));
        agregarCeldaDatoCentColor(tabla,funcAux.muestraDatoDelControl(saludOc[10], saludOc[11], 1));
        tabla.setHorizontalAlignment(0);
        saludOcular.add(tabla);
        agregarLineaEnBlanco(saludOcular, 1);
        
        String aviso = "";
        String aviso2 = "";
        if (ninio.isSexo()){
            aviso = "* Prematuro menor de 28 semanas de edad gestacional o peso menor a 1500 g debe iniciar control de retina a las 31 semanas de edad corregida.";
            aviso2 = "* Prematuro nacido entre 28 y 32 semanas de edad gestacional debe iniciar control de retina a partir del primer mes de vida.";
        }else{
            aviso = "* Prematura menor de 28 semanas de edad gestacional o peso menor a 1500 g debe iniciar control de retina a las 31 semanas de edad corregida.";
            aviso2 = "* Prematura nacida entre 28 y 32 semanas de edad gestacional debe iniciar control de retina a partir del primer mes de vida.";
        }
        Paragraph avi = new Paragraph(aviso, chicaFont);
        saludOcular.add(avi);
        Paragraph avi2 = new Paragraph(aviso2, chicaFont);
        saludOcular.add(avi2);
        agregarLineaEnBlanco(saludOcular, 2);
        
        //Carga de datos de los controles de salud ocular
        if(!ninio.getCarne().getSaludOcular().esVaciaDiagnosticos()){
            ArrayList<SaludOcularDiagnostico> lista = ninio.getCarne().getSaludOcular().getDiagnosticos();
            PdfPTable tabla1 = new PdfPTable (new float [] {1.5f, 3.5f, 2.0f});
            tabla1.setWidthPercentage (90.0f);
            agregarCeldaTitCentColor(tabla1,"Fecha");
            agregarCeldaTitCentColor(tabla1,"Diagnóstico");
            agregarCeldaTitCentColor(tabla1,"Médico");
            SimpleDateFormat formatoFecha = new SimpleDateFormat("dd/MM/yyyy");
            for(int i = 0; i<lista.size()&&i<15; i++){
                agregarCeldaDatoCentColor(tabla1,formatoFecha.format(lista.get(i).getFecha()));
                agregarCeldaDatoIzqColor(tabla1,lista.get(i).getDiagTratamiento());
                agregarCeldaDatoCentColor(tabla1,lista.get(i).getMedico().toString());
            }
            tabla1.setHorizontalAlignment(0);
            Paragraph Subtitulo = new Paragraph("Controles de salud ocular", sinDatosFont);
            saludOcular.add(Subtitulo);
            agregarLineaEnBlanco(saludOcular, 1);
            saludOcular.add(tabla1);
            agregarLineaEnBlanco(saludOcular, 1);
            if(lista.size()>=15){
                Paragraph nota = new Paragraph("Por razones de espacio, se muestran hasta 15 controles", chicaFont);
                saludOcular.add(nota);
                Paragraph nota2 = new Paragraph("Para ver la lista completa de controles acceda a la versión digital del carné", chicaFont);
                saludOcular.add(nota2);
            }
        }else{
            agregarLineaEnBlanco(saludOcular, 1);
            Paragraph avi3 = new Paragraph("No se han anotado controles oculares", sinDatosFont);
            saludOcular.add(avi3);
        }

        saludOcular.setAlignment(Element.ALIGN_LEFT);
        saludOcular.setIndentationLeft(50);
        Chapter chap= new Chapter(saludOcular, 9);
        documento.add(chap);
        documento.setPageCount(++paginas);
        finDePagina(unWriter, documento);
        documento.newPage();

    }

    public void saludBucal(Document documento, PdfWriter unWriter)throws DocumentException{

        Anchor anchor = new Anchor("SALUD BUCAL", capituloFont);
        anchor.setLeading(15);
        anchor.setName("Salud bucal");

        Paragraph saludBucal = new Paragraph(anchor);
        agregarLineaEnBlanco(saludBucal, 2);
        
        Paragraph nota = new Paragraph("- Se recomienda control con odontólogo cada seis meses desde el nacimiento hasta que cumpla los 3 años y a partir de los 3 años control odontológico anual.", chicaFont);
        saludBucal.add(nota);
        Paragraph nota2 = new Paragraph("- No limpiar el chupete con la boca del adulto, ni agregar miel u otros dulces.", chicaFont);
        saludBucal.add(nota2);
        Paragraph nota3 = new Paragraph("- Después de la erupción dentaria y hasta los 2 años de edad se recomienda la higiene con cepillo sin pasta dental.", chicaFont);
        saludBucal.add(nota3);
        Paragraph nota4 = new Paragraph("- A partir de los 2 años cepillar con pasta dental después de cada comida.", chicaFont);
        saludBucal.add(nota4);
        Paragraph nota5 = new Paragraph("- Evite que consuma en exceso caramelos y bebidas azucaradas.", chicaFont);
        saludBucal.add(nota5);
        Paragraph nota6 = new Paragraph("- Es importante mantener sanos los dientes temporarios ya que por caries o pérdida anticipada de los mismos, se pueden afectar los dientes definitivos.", chicaFont);
        saludBucal.add(nota6);
        agregarLineaEnBlanco(saludBucal, 1);

        String[] salBuc = ninio.getCarne().getSaludBucal();
        if(!ninio.getCarne().esVacioSaludBucal()){
            // Se crea una tabla para los datos
            PdfPTable tabla = new PdfPTable (new float [] {1.5f, 2.0f, 2.0f, 2.0f});
            tabla.setWidthPercentage (90.0f);
            agregarCeldaTitCentColor(tabla, "Edad (años)");
            agregarCeldaTitCentColor(tabla, "Enfermedad caries");
            agregarCeldaTitCentColor(tabla, "Pérdidas dentarias");
            agregarCeldaTitCentColor(tabla, "Gingivitis u otras");
            agregarCeldaTitCentColor(tabla,"6");
            agregarCeldaDatoCentColor(tabla,salBuc[0]);
            agregarCeldaDatoCentColor(tabla,salBuc[1]);
            agregarCeldaDatoCentColor(tabla,salBuc[2]);
            agregarCeldaTitCentColor(tabla,"9");
            agregarCeldaDatoCentColor(tabla,salBuc[3]);
            agregarCeldaDatoCentColor(tabla,salBuc[4]);
            agregarCeldaDatoCentColor(tabla,salBuc[5]);
            agregarCeldaTitCentColor(tabla,"12");
            agregarCeldaDatoCentColor(tabla,salBuc[6]);
            agregarCeldaDatoCentColor(tabla,salBuc[7]);
            agregarCeldaDatoCentColor(tabla,salBuc[8]);
            tabla.setHorizontalAlignment(0);
            saludBucal.add(tabla);
        }else{
            Paragraph sinDatos = new Paragraph("No se han anotado controles de salud bucal", sinDatosFont);
            saludBucal.add(sinDatos);
            agregarLineaEnBlanco(saludBucal, 2);
        }

        saludBucal.setAlignment(Element.ALIGN_LEFT);
        saludBucal.setIndentationLeft(50);
        Chapter chap= new Chapter(saludBucal, 10);
        documento.add(chap);
        documento.setPageCount(++paginas);
        finDePagina(unWriter, documento);
        documento.newPage();

    }

    private void controlesSaludHastaDosAnios (Document documento, PdfWriter unWriter) throws DocumentException{
        Anchor anchorH2 = new Anchor("CONTROLES DE SALUD HASTA 2 AÑOS", capituloFont);
        anchorH2.setLeading(15);
        anchorH2.setName("CONTROLES DE SALUD HASTA 2 AÑOS");
        Paragraph cont = new Paragraph(anchorH2);
        agregarLineaEnBlanco(cont, 2);

        if(!ninio.getCarne().esVaciaControlSaludHastaDos()){
            ArrayList<ControlSaludHastaDosAnios> lista = ninio.getCarne().getControlDeSaludHastaDos();
            PdfPTable tabla = new PdfPTable (new float [] {1.2f, 1.5f, 0.8f, 0.7f, 0.6f, 0.6f, 0.5f, 0.5f, 0.5f, 1.9f, 1.2f, 1.4f});
            tabla.setWidthPercentage (100.0f);
            agregarCeldaTitCentColor(tabla, "Fecha");
            agregarCeldaTitCentColor(tabla, "Edad");
            agregarCeldaTitCentColor(tabla, "Peso (gr)");
            agregarCeldaTitCentColor(tabla, "Talla (cm)");
            agregarCeldaTitCentColor(tabla, "PC (cm)");
            agregarCeldaTitCentColor(tabla, "pde");
            agregarCeldaTitCentColor(tabla, "Art");
            agregarCeldaTitCentColor(tabla, "Fe");
            agregarCeldaTitCentColor(tabla, "vit D");
            agregarCeldaTitCentColor(tabla, "Observaciones");
            agregarCeldaTitCentColor(tabla, "Fecha egreso");
            agregarCeldaTitCentColor(tabla, "Medico");
            
            SimpleDateFormat formatoFecha = new SimpleDateFormat("dd/MM/yyyy");
            for(int i = 0; i<lista.size()&&i<15; i++){
                agregarCeldaDatoCentColorChica(tabla, formatoFecha.format(lista.get(i).getFecha()));
                agregarCeldaDatoCentColorChica(tabla, funcAux.muestraEdad(lista.get(i).getEdad()));
                agregarCeldaDatoCentColorChica(tabla, Integer.toString(lista.get(i).getPeso()));
                agregarCeldaDatoCentColorChica(tabla, Integer.toString(lista.get(i).getTalla()));
                agregarCeldaDatoCentColorChica(tabla, Integer.toString(lista.get(i).getPerimetroCraneal()));
                String pde = "";
                if (lista.get(i).isAlimentacionPde()){
                    pde = "Si";
                }
                agregarCeldaDatoCentColorChica(tabla, pde);
                
                String art = "";
                if (lista.get(i).isAlimentacionArtificial()){
                    art = "Si";
                }
                agregarCeldaDatoCentColorChica(tabla,art);
                
                String fe = "";
                if (lista.get(i).isHierro()){
                    fe = "Si";
                }
                agregarCeldaDatoCentColorChica(tabla,fe);
                String vit = "";
                if (lista.get(i).isVitD()){
                    vit = "Si";
                }
                agregarCeldaDatoCentColorChica(tabla,vit);
                agregarCeldaDatoCentColorChica(tabla,lista.get(i).getObservaciones());
                agregarCeldaDatoCentColorChica(tabla,formatoFecha.format(lista.get(i).getProximoCont()));
                agregarCeldaDatoCentColorChica(tabla,lista.get(i).getMedico().toString());
            }
            cont.add(tabla);
            agregarLineaEnBlanco(cont, 1);

            Paragraph pc = new Paragraph("pc: perímetro cefálico",chicaFont);
            cont.add(pc);
            Paragraph pde = new Paragraph("pde: pecho directo exclusivo",chicaFont);
            cont.add(pde);
            Paragraph art = new Paragraph("art: alimentación artificial",chicaFont);
            cont.add(art);
            Paragraph fe = new Paragraph("fe: Hierro",chicaFont);
            cont.add(fe);
            Paragraph vit = new Paragraph("vit.D: vitamina D",chicaFont);
            cont.add(vit);
            agregarLineaEnBlanco(cont, 1);
            Paragraph graf = new Paragraph("En las páginas 16,18 y 21 pueden consultarse gráficas evolutivas",chicaFont);
            cont.add(graf);
            if(lista.size()> 15){
                Paragraph nota = new Paragraph("Por razones de espacio, se muestran hasta 15 controles de salud hasta 2 años", normalFont);
                cont.add(nota);
                Paragraph nota2 = new Paragraph("Para ver la lista completa de controles de salud hasta 2 años acceda a la versión digital del carné", normalFont);
                cont.add(nota2);
            }
        }
        else{
            agregarLineaEnBlanco(cont, 1);
            Paragraph aviso = new Paragraph("No se han anotado controles de salud hasta 2 años", sinDatosFont);
            cont.add(aviso);
        }

        Chapter chap= new Chapter(cont, 5);
        documento.add(chap);
        documento.setPageCount(++paginas);
        finDePagina(unWriter, documento);
        documento.newPage();
    }

    private void controlesSaludDesdeDosAnios (Document documento, PdfWriter unWriter) throws DocumentException{
        Anchor anchorCd = new Anchor("CONTROLES DE SALUD DESDE 2 AÑOS", capituloFont);
        anchorCd.setLeading(15);
        anchorCd.setName("CONTROLES DE SALUD DESDE 2 AÑOS");
        Paragraph cont = new Paragraph(anchorCd);
        agregarLineaEnBlanco(cont, 1);

        if(!ninio.getCarne().esVaciaControlSaludDesdeDos()){
            ArrayList<ControlSaludDesdeDosAnios> lista = ninio.getCarne().getControlDeSaludDesdeDos();
            PdfPTable tabla = new PdfPTable (new float [] {1.2f, 1.5f, 0.8f, 0.7f, 0.6f, 0.6f, 0.6f, 1.9f, 1.2f, 1.4f});
            tabla.setWidthPercentage (100.0f);
            agregarCeldaTitCentColor(tabla,"Fecha");
            agregarCeldaTitCentColor(tabla,"Edad");
            agregarCeldaTitCentColor(tabla,"Peso (gr)");
            agregarCeldaTitCentColor(tabla,"Talla (cm)");
            agregarCeldaTitCentColor(tabla,"IMC");
            agregarCeldaTitCentColor(tabla,"PAS");
            agregarCeldaTitCentColor(tabla,"PAD");
            agregarCeldaTitCentColor(tabla,"Observaciones");
            agregarCeldaTitCentColor(tabla,"Fecha egreso");
            agregarCeldaTitCentColor(tabla,"Medico");
            SimpleDateFormat formatoFecha = new SimpleDateFormat("dd/MM/yyyy");
            for(int i = 0; i<lista.size()&&i<15; i++){
                agregarCeldaDatoCentColorChica(tabla, formatoFecha.format(lista.get(i).getFecha()));
                agregarCeldaDatoCentColorChica(tabla, funcAux.muestraEdad(lista.get(i).getEdad()));
                agregarCeldaDatoCentColorChica(tabla, Integer.toString(lista.get(i).getPeso()));
                agregarCeldaDatoCentColorChica(tabla, Integer.toString(lista.get(i).getTalla()));
                double imc = (Math.rint(lista.get(i).getImc()*100))/100;
                agregarCeldaDatoCentColorChica(tabla, Double.toString(imc));
                agregarCeldaDatoCentColorChica(tabla, Integer.toString(lista.get(i).getPas()));
                agregarCeldaDatoCentColorChica(tabla, Integer.toString(lista.get(i).getPad()));
                agregarCeldaDatoCentColorChica(tabla, lista.get(i).getObservaciones());
                agregarCeldaDatoCentColorChica(tabla, formatoFecha.format(lista.get(i).getProximoCont()));
                agregarCeldaDatoCentColorChica(tabla, lista.get(i).getMedico().toString());
            }
            cont.add(tabla);
            agregarLineaEnBlanco(cont, 1);
            Paragraph imc = new Paragraph("IMC: índice de masa corporal: peso/(talla al cuadrado)",chicaFont);
            cont.add(imc);
            Paragraph pas = new Paragraph("pas: presión arterial sistólica",chicaFont);
            cont.add(pas);
            Paragraph pad = new Paragraph("pad: presión arterial diastólica",chicaFont);
            cont.add(pad);
            agregarLineaEnBlanco(cont, 1);
            Paragraph graf = new Paragraph("En las páginas 17,19,20 y 22 pueden consultarse gráficas evolutivas",chicaFont);
            cont.add(graf);
            if(lista.size()> 15){
                Paragraph nota = new Paragraph("Por razones de espacio, se muestran hasta 15 controles de salud desde 2 años", normalFont);
                cont.add(nota);
                Paragraph nota2 = new Paragraph("Para ver la lista completa de controles de salud desde 2 años acceda a la versión digital del carné", normalFont);
                cont.add(nota2);
            }
        }
        else{
            agregarLineaEnBlanco(cont, 1);
            Paragraph aviso = new Paragraph("No se han anotado controles de salud desde 2 años", sinDatosFont);
            cont.add(aviso);
        }

        Chapter chap= new Chapter(cont,6);
        documento.add(chap);
        documento.setPageCount(++paginas);
        finDePagina(unWriter, documento);
        documento.newPage();
    }

    private void ecografias (Document documento, PdfWriter unWriter) throws DocumentException{
        Anchor anchorEco = new Anchor("ECOGRAFIAS", capituloFont);
        anchorEco.setLeading(15);
        anchorEco.setName("ECOGRAFIAS");
        Paragraph eco = new Paragraph(anchorEco);
        agregarLineaEnBlanco(eco, 1);

        if(!ninio.getCarne().esVaciaEcoCadera()){
            ArrayList<Ecografia> lista = ninio.getCarne().getEcografias();
            PdfPTable tabla = new PdfPTable (new float [] {1.1f, 1.5f, 3.0f, 1.7f});
            tabla.setWidthPercentage (90.0f);
            agregarCeldaTitCentColor(tabla, "Fecha");
            agregarCeldaTitCentColor(tabla, "Edad");
            agregarCeldaTitCentColor(tabla, "Resultado");
            agregarCeldaTitCentColor(tabla, "Medico");
            SimpleDateFormat formatoFecha = new SimpleDateFormat("dd/MM/yyyy");
            for(int i = 0; i<lista.size()&&i<15; i++){
                agregarCeldaDatoCentColor(tabla, formatoFecha.format(lista.get(i).getFecha()));
                agregarCeldaDatoCentColor(tabla, funcAux.muestraEdad(lista.get(i).getEdad()));
                agregarCeldaDatoCentColor(tabla, lista.get(i).getResultado());
                agregarCeldaDatoCentColor(tabla, lista.get(i).getEcografista().toString());
            }
            eco.add(tabla);
            agregarLineaEnBlanco(eco, 1);
            if(lista.size()> 15){
                Paragraph nota = new Paragraph("Por razones de espacio, se muestran hasta 15 ecografias", normalFont);
                eco.add(nota);
                Paragraph nota2 = new Paragraph("Para ver la lista completa de ecografias acceda a la versión digital del carné", normalFont);
                eco.add(nota2);
            }
        }else{
            agregarLineaEnBlanco(eco, 1);
            Paragraph aviso = new Paragraph("No se han anotado ecografias", sinDatosFont);
            eco.add(aviso);
        }
        eco.setAlignment(Element.ALIGN_LEFT);
        eco.setIndentationLeft(50);

        Chapter chap= new Chapter(eco, 11);
        documento.add(chap);
        documento.setPageCount(++paginas);
        finDePagina(unWriter, documento);
        documento.newPage();
    }

    private void interconsultas (Document documento, PdfWriter unWriter) throws DocumentException{
        Anchor anchorIn = new Anchor("INTERCONSULTAS", capituloFont);
        anchorIn.setLeading(15);
        anchorIn.setName("INTERCONSULTAS");
        Paragraph inter = new Paragraph(anchorIn);
        agregarLineaEnBlanco(inter, 1);

        if(!ninio.getCarne().esVaciaInterconsultas()){
            ArrayList<Interconsulta> lista = ninio.getCarne().getInterconsultas();
            PdfPTable tabla = new PdfPTable (new float [] {1.1f, 1.5f, 1.6f, 2.5f, 1.7f});
            tabla.setWidthPercentage (90.0f);
            agregarCeldaTitCentColor(tabla, "Fecha");
            agregarCeldaTitCentColor(tabla, "Edad");
            agregarCeldaTitCentColor(tabla,"Especialidad");
            agregarCeldaTitCentColor(tabla,"Diagnóstico/Tratamiento");
            agregarCeldaTitCentColor(tabla,"Medico");
            SimpleDateFormat formatoFecha = new SimpleDateFormat("dd/MM/yyyy");
            for(int i = 0; i<lista.size()&&i<=15; i++){
                agregarCeldaDatoCentColor(tabla,formatoFecha.format(lista.get(i).getFecha()));
                agregarCeldaDatoCentColor(tabla,funcAux.muestraEdad(lista.get(i).getEdad()));
                agregarCeldaDatoCentColor(tabla,lista.get(i).getEspecialidad());
                agregarCeldaDatoCentColor(tabla,lista.get(i).getDiagTratamineto());
                agregarCeldaDatoCentColor(tabla,lista.get(i).getMedico().toString());
            }
            inter.add(tabla);
            agregarLineaEnBlanco(inter, 1);
            if(lista.size()> 15){
                Paragraph nota = new Paragraph("Por razones de espacio, se muestran hasta 15 interconsultas", normalFont);
                inter.add(nota);
                Paragraph nota2 = new Paragraph("Para ver la lista completa de interconsultas acceda a la versión digital del carné", normalFont);
                inter.add(nota2);
            }
        }
        else{
            agregarLineaEnBlanco(inter, 1);
            Paragraph aviso = new Paragraph("No se han anotado interconsultas", sinDatosFont);
            inter.add(aviso);
        }
        inter.setAlignment(Element.ALIGN_LEFT);
        inter.setIndentationLeft(50);

        Chapter chap= new Chapter(inter, 7);
        documento.add(chap);
        documento.setPageCount(++paginas);
        finDePagina(unWriter, documento);
        documento.newPage();
    }

    private void hospitalizacionesEnf (Document documento, PdfWriter unWriter) throws DocumentException{
        Anchor anchorH = new Anchor("HOSPITALIZACIONES - ENFERMEDADES", capituloFont);
        anchorH.setLeading(15);
        anchorH.setName("HOSPITALIZACIONES - ENFERMEDADES");
        Paragraph hosp = new Paragraph(anchorH);
        agregarLineaEnBlanco(hosp, 1);

        if(!ninio.getCarne().esVaciaHospEnf()){
            ArrayList<HospEnf> lista = ninio.getCarne().getHospEnf();
            PdfPTable tabla = new PdfPTable (new float [] {1.1f, 1.5f, 2.3f, 1.2f, 1.7f});
            tabla.setWidthPercentage (90.0f);
            agregarCeldaTitCentColor(tabla,"Fecha");
            agregarCeldaTitCentColor(tabla,"Edad");
            agregarCeldaTitCentColor(tabla,"Diagnóstico/Tratamiento");
            agregarCeldaTitCentColor(tabla,"Fecha egreso");
            agregarCeldaTitCentColor(tabla,"Medico");
            SimpleDateFormat formatoFecha = new SimpleDateFormat("dd/MM/yyyy");
            for(int i = 0; i<lista.size()&&i<=15; i++){
                agregarCeldaDatoCentColor(tabla,formatoFecha.format(lista.get(i).getFecha()));
                agregarCeldaDatoCentColor(tabla,funcAux.muestraEdad(lista.get(i).getEdad()));
                agregarCeldaDatoCentColor(tabla,lista.get(i).getDiagTratamiento());
                agregarCeldaDatoCentColor(tabla,formatoFecha.format(lista.get(i).getFechaEgreso()));
                agregarCeldaDatoCentColor(tabla,lista.get(i).getMedico().toString());
            }
            hosp.add(tabla);
            agregarLineaEnBlanco(hosp, 1);
            if(lista.size()> 15){
                Paragraph nota = new Paragraph("Por razones de espacio, se muestran hasta 15 hospitalizaciones y enfermedades", normalFont);
                hosp.add(nota);
                Paragraph nota2 = new Paragraph("Para ver la lista completa de hospitalizaciones y enfermedades acceda a la versión digital del carné", normalFont);
                hosp.add(nota2);
            }
        }
        else{
            agregarLineaEnBlanco(hosp, 1);
            Paragraph aviso = new Paragraph("No se han anotado hospitalizaciones y enfermedades", sinDatosFont);
            hosp.add(aviso);
        }
        hosp.setAlignment(Element.ALIGN_LEFT);
        hosp.setIndentationLeft(50);

        Chapter chap= new Chapter(hosp, 8);
        documento.add(chap);
        documento.setPageCount(++paginas);
        finDePagina(unWriter, documento);
        documento.newPage();
    }

    private void notas (Document documento, PdfWriter unWriter) throws DocumentException{
        Anchor anchorN= new Anchor("NOTAS", capituloFont);
        anchorN.setLeading(15);
        anchorN.setName("NOTAS");
        Paragraph nota = new Paragraph(anchorN);
        agregarLineaEnBlanco(nota, 1);

        if (!ninio.getCarne().esVaciaNotas()){
            ArrayList<Nota> lista = ninio.getCarne().getNotas();
            PdfPTable tabla = new PdfPTable (new float [] {1.1f, 1.5f, 3f, 1.7f});
            tabla.setWidthPercentage (90.0f);
            agregarCeldaTitCentColor(tabla,"Fecha");
            agregarCeldaTitCentColor(tabla,"Edad");
            agregarCeldaTitCentColor(tabla,"Nota");
            agregarCeldaTitCentColor(tabla,"Autor");
            SimpleDateFormat formatoFecha = new SimpleDateFormat("dd/MM/yyyy");
            for(int i = 0; i<lista.size()&&i<=15; i++){
                agregarCeldaDatoCentColor(tabla,formatoFecha.format(lista.get(i).getFecha()));
                agregarCeldaDatoCentColor(tabla,funcAux.muestraEdad(lista.get(i).getEdad()));
                agregarCeldaDatoCentColor(tabla,lista.get(i).getAnotacion());
                agregarCeldaDatoCentColor(tabla,lista.get(i).getActor().toString());
            }
            nota.add(tabla);
            agregarLineaEnBlanco(nota, 1);
            if(lista.size()> 15){
                Paragraph aviso = new Paragraph("Por razones de espacio, se muestran hasta 15 anotaciones", normalFont);
                nota.add(aviso);
                Paragraph aviso2 = new Paragraph("Para ver la lista completa de anotaciones acceda a la versión digital del carné", normalFont);
                nota.add(aviso2);
            }
        }
        else{
            agregarLineaEnBlanco(nota, 1);
            Paragraph aviso = new Paragraph("No se han hecho anotaciones", sinDatosFont);
            nota.add(aviso);
        }
        nota.setAlignment(Element.ALIGN_LEFT);
        nota.setIndentationLeft(50);

        Chapter chap= new Chapter(nota, 13);
        documento.add(chap);
        documento.setPageCount(++paginas);
        finDePagina(unWriter, documento);
        documento.newPage();
    }

    private void graficas(Document documento, PdfWriter unWriter) throws DocumentException, IOException  {
        
        Anchor anchorG= new Anchor("GRAFICAS", capituloFont);
        anchorG.setLeading(15);
        anchorG.setName("GRAFICAS");
        Paragraph grafica = new Paragraph(anchorG);
        agregarLineaEnBlanco(grafica, 2);
        for(int numero = 1; numero <= 7; numero++){
            switch(numero){
                case 1:{
                    if(ninio.isSexo()){
                        Chapter chap = new Chapter(grafica, 15);
                        Paragraph titulo = new Paragraph("Peso para la edad de los niños", capituloFont);
                        chap.add(titulo);
                        agregarLineaEnBlanco(grafica, 1);
                        Paragraph subTitulo = new Paragraph("Percentiles (nacimiento a 2 años)", subCapituloFont);
                        chap.add(subTitulo);
                        agregarLineaEnBlanco(grafica, 1);
                        // Parámetros de la grafica
                        XYSeriesCollection coleccion = funcionesG.graficaPeso02Niño();
                        String tituloDominio = "Edad en meses";
                        String tituloRange = "Peso(kg)";
                        Double rangoDLow = 0.0;
                        Double rangoDUp = 24.0;
                        Double rangoRLow = 1.0;
                        Double rangoRUp = 26.0;
                        // Se crea la grafica con los parametros y se le da formato
                        JFreeChart chart =  funcionesG.crearGrafica(tituloDominio, tituloRange, coleccion);
                        funcionesG.darFormatoTabla(chart, rangoDLow, rangoDUp, rangoRLow, rangoRUp);
                        BufferedImage image = chart.createBufferedImage(450, 400);
                        Image graf = com.itextpdf.text.Image.getInstance(image, null);
                        chap.add(graf);
                        setPercentilesGrafica(chap,"Niño");
                        documento.add(chap);
                        documento.setPageCount(++paginas);
                        finDePagina(unWriter, documento);
                    }else{
                        Chapter chap = new Chapter(15);
                        Paragraph titulo = new Paragraph("Peso para la edad de las niñas", capituloFont);
                        chap.add(titulo);
                        agregarLineaEnBlanco(grafica, 1);
                        Paragraph subTitulo = new Paragraph("Percentiles (nacimiento a 2 años)", subCapituloFont);
                        chap.add(subTitulo);
                        agregarLineaEnBlanco(grafica, 1);
                        // Parámetros de la grafica
                        XYSeriesCollection coleccion = funcionesG.graficaPeso02Niña();
                        String tituloDominio = "Edad en meses";
                        String tituloRange = "Peso(kg)";
                        Double rangoDLow = 0.0;
                        Double rangoDUp = 24.0;
                        Double rangoRLow = 1.0;
                        Double rangoRUp = 26.0;
                        // Se crea la grafica con los parametros y se le da formato
                        JFreeChart chart =  funcionesG.crearGrafica(tituloDominio, tituloRange, coleccion);
                        funcionesG.darFormatoTabla(chart, rangoDLow, rangoDUp, rangoRLow, rangoRUp);
                        BufferedImage image =chart.createBufferedImage(450, 400);
                        Image graf = com.itextpdf.text.Image.getInstance(image, null);
                        chap.add(graf);
                        setPercentilesGrafica(chap,"Niña");
                        documento.add(chap);
                        documento.setPageCount(++paginas);
                        finDePagina(unWriter, documento);
                    }
                    break;
                }
                case 2:{
                    if(ninio.isSexo()){
                        Chapter chap = new Chapter(16);
                        Paragraph titulo = new Paragraph("Peso / Estatura", capituloFont);
                        chap.add(titulo);
                        agregarLineaEnBlanco(grafica, 1);
                        Paragraph subTitulo = new Paragraph("Percentiles (2 a 5 años)", subCapituloFont);
                        chap.add(subTitulo);
                        agregarLineaEnBlanco(grafica, 1);
                        // Parámetros de la grafica
                        XYSeriesCollection coleccion = funcionesG.graficaPesoEstatura25Niño();
                        String tituloDominio = "Estatura(cm)";
                        String tituloRange = "Peso(kg)";
                        Double rangoDLow = 65.0;
                        Double rangoDUp = 120.0;
                        Double rangoRLow = 5.0;
                        Double rangoRUp = 46.0;
                        // Se crea la grafica con los parametros y se le da formato
                        JFreeChart chart =  funcionesG.crearGrafica(tituloDominio, tituloRange, coleccion);
                        funcionesG.darFormatoTabla(chart, rangoDLow, rangoDUp, rangoRLow, rangoRUp);
                        BufferedImage image =chart.createBufferedImage(450, 400);
                        Image graf = com.itextpdf.text.Image.getInstance(image, null);
                        chap.add(graf);
                        setPercentilesGrafica(chap,"Niño");
                        documento.add(chap);
                        documento.setPageCount(++paginas);
                        finDePagina(unWriter, documento);
                    }else{
                        Chapter chap = new Chapter(16);
                        Paragraph titulo = new Paragraph("Peso / Estatura", capituloFont);
                        chap.add(titulo);
                        agregarLineaEnBlanco(grafica, 1);
                        Paragraph subTitulo = new Paragraph("Percentiles (2 a 5 años)", subCapituloFont);
                        chap.add(subTitulo);
                        agregarLineaEnBlanco(grafica, 1);
                        // Parámetros de la grafica
                        XYSeriesCollection coleccion = funcionesG.graficaPesoEstatura25Niña();
                        String tituloDominio = "Estatura(cm)";
                        String tituloRange = "Peso(kg)";
                        Double rangoDLow = 65.0;
                        Double rangoDUp = 120.0;
                        Double rangoRLow = 5.0;
                        Double rangoRUp = 46.0;
                        // Se crea la grafica con los parametros y se le da formato
                        JFreeChart chart =  funcionesG.crearGrafica(tituloDominio, tituloRange, coleccion);
                        funcionesG.darFormatoTabla(chart, rangoDLow, rangoDUp, rangoRLow, rangoRUp);
                        BufferedImage image =chart.createBufferedImage(450, 400);
                        Image graf = com.itextpdf.text.Image.getInstance(image, null);
                        chap.add(graf);
                        setPercentilesGrafica(chap,"Niña");
                        documento.add(chap);
                        documento.setPageCount(++paginas);
                        finDePagina(unWriter, documento);
                    }
                    break;
                }
                case 3:{
                    if(ninio.isSexo()){
                        Chapter chap = new Chapter(17);
                        Paragraph titulo = new Paragraph("Longitud para la edad de los niños", capituloFont);
                        chap.add(titulo);
                        agregarLineaEnBlanco(grafica, 1);
                        Paragraph subTitulo = new Paragraph("Percentiles (nacimiento a 2 años)", subCapituloFont);
                        chap.add(subTitulo);
                        agregarLineaEnBlanco(grafica, 1);
                        // Parámetros de la grafica
                        XYSeriesCollection coleccion = funcionesG.graficaLongitud02Niño();
                        String tituloDominio = "Edad en meses";
                        String tituloRange = "Longitud / estatura(cm)";
                        Double rangoDLow = 0.0;
                        Double rangoDUp = 24.0;
                        Double rangoRLow = 43.0;
                        Double rangoRUp = 130.0;
                        // Se crea la grafica con los parametros y se le da formato
                        JFreeChart chart =  funcionesG.crearGrafica(tituloDominio, tituloRange, coleccion);
                        funcionesG.darFormatoTabla(chart, rangoDLow, rangoDUp, rangoRLow, rangoRUp);
                        BufferedImage image =chart.createBufferedImage(450, 400);
                        Image graf = com.itextpdf.text.Image.getInstance(image, null);
                        chap.add(graf);
                        setPercentilesGrafica(chap,"Niño");
                        documento.add(chap);
                        documento.setPageCount(++paginas);
                        finDePagina(unWriter, documento);
                    }else{
                        Chapter chap = new Chapter(17);
                        Paragraph titulo = new Paragraph("Longitud para la edad de las niñas", capituloFont);
                        chap.add(titulo);
                        agregarLineaEnBlanco(grafica, 1);
                        Paragraph subTitulo = new Paragraph("Percentiles (nacimiento a 2 años)", subCapituloFont);
                        chap.add(subTitulo);
                        agregarLineaEnBlanco(grafica, 1);
                        // Parámetros de la grafica
                        XYSeriesCollection coleccion = funcionesG.graficaLongitud02Niña();
                        String tituloDominio = "Edad en meses";
                        String tituloRange = "Longitud / estatura(cm)";
                        Double rangoDLow = 0.0;
                        Double rangoDUp = 24.0;
                        Double rangoRLow = 43.0;
                        Double rangoRUp = 130.0;
                        // Se crea la grafica con los parametros y se le da formato
                        JFreeChart chart =  funcionesG.crearGrafica(tituloDominio, tituloRange, coleccion);
                        funcionesG.darFormatoTabla(chart, rangoDLow, rangoDUp, rangoRLow, rangoRUp);
                        BufferedImage image =chart.createBufferedImage(450, 400);
                        Image graf = com.itextpdf.text.Image.getInstance(image, null);
                        chap.add(graf);
                        setPercentilesGrafica(chap,"Niña");
                        documento.add(chap);
                        documento.setPageCount(++paginas);
                        finDePagina(unWriter, documento);
                    }
                    break;
                }    
                case 4:{
                    if(ninio.isSexo()){
                        Chapter chap = new Chapter(18);
                        Paragraph titulo = new Paragraph("Estatura para la edad de los niños", capituloFont);
                        chap.add(titulo);
                        agregarLineaEnBlanco(grafica, 1);
                        Paragraph subTitulo = new Paragraph("Percentiles (2 a 5 años)", subCapituloFont);
                        chap.add(subTitulo);
                        agregarLineaEnBlanco(grafica, 1);
                        // Parámetros de la grafica
                        XYSeriesCollection coleccion = funcionesG.graficaEstatura25Niño();
                        String tituloDominio = "Edad en meses";
                        String tituloRange = "Estatura(cm)";
                        Double rangoDLow = 24.0;
                        Double rangoDUp = 60.0;
                        Double rangoRLow = 43.0;
                        Double rangoRUp = 130.0;
                        // Se crea la grafica con los parametros y se le da formato
                        JFreeChart chart =  funcionesG.crearGrafica(tituloDominio, tituloRange, coleccion);
                        funcionesG.darFormatoTabla(chart, rangoDLow, rangoDUp, rangoRLow, rangoRUp);
                        BufferedImage image =chart.createBufferedImage(450, 400);
                        Image graf = com.itextpdf.text.Image.getInstance(image, null);
                        chap.add(graf);
                        setPercentilesGrafica(chap,"Niño");
                        documento.add(chap);
                        documento.setPageCount(++paginas);
                        finDePagina(unWriter, documento);
                    }else{
                        Chapter chap = new Chapter(18);
                        Paragraph titulo = new Paragraph("Estatura para la edad de las niñas", capituloFont);
                        chap.add(titulo);
                        agregarLineaEnBlanco(grafica, 1);
                        Paragraph subTitulo = new Paragraph("Percentiles (2 a 5 años)", subCapituloFont);
                        chap.add(subTitulo);
                        agregarLineaEnBlanco(grafica, 1);
                        // Parámetros de la grafica
                        XYSeriesCollection coleccion = funcionesG.graficaEstatura25Niña();
                        String tituloDominio = "Edad en meses";
                        String tituloRange = "Estatura(cm)";
                        Double rangoDLow = 24.0;
                        Double rangoDUp = 60.0;
                        Double rangoRLow = 43.0;
                        Double rangoRUp = 130.0;
                        // Se crea la grafica con los parametros y se le da formato
                        JFreeChart chart =  funcionesG.crearGrafica(tituloDominio, tituloRange, coleccion);
                        funcionesG.darFormatoTabla(chart, rangoDLow, rangoDUp, rangoRLow, rangoRUp);
                        BufferedImage image =chart.createBufferedImage(450, 400);
                        Image graf = com.itextpdf.text.Image.getInstance(image, null);
                        chap.add(graf);
                        setPercentilesGrafica(chap,"Niña");
                        documento.add(chap);
                        documento.setPageCount(++paginas);
                        finDePagina(unWriter, documento);
                    }
                    break;
                }
                case 5:{
                    if(ninio.isSexo()){
                        Chapter chap = new Chapter(19);
                        Paragraph titulo = new Paragraph("Estatura para la edad de los niños", capituloFont);
                        chap.add(titulo);
                        agregarLineaEnBlanco(grafica, 1);
                        Paragraph subTitulo = new Paragraph("Percentiles (5 a 15 años)", subCapituloFont);
                        chap.add(subTitulo);
                        agregarLineaEnBlanco(grafica, 1);
                        // Parámetros de la grafica
                        XYSeriesCollection coleccion = funcionesG.graficaEstatura515Niño();
                        String tituloDominio = "Edad en meses";
                        String tituloRange = "Estatura(cm)";
                        Double rangoDLow = 61.0;
                        Double rangoDUp = 180.0;
                        Double rangoRLow = 100.0;
                        Double rangoRUp = 230.0;
                        // Se crea la grafica con los parametros y se le da formato
                        JFreeChart chart =  funcionesG.crearGrafica(tituloDominio, tituloRange, coleccion);
                        funcionesG.darFormatoTabla(chart, rangoDLow, rangoDUp, rangoRLow, rangoRUp);
                        BufferedImage image =chart.createBufferedImage(450, 400);
                        Image graf = com.itextpdf.text.Image.getInstance(image, null);
                        chap.add(graf);
                        setPercentilesGrafica(chap,"Niño");
                        documento.add(chap);
                        documento.setPageCount(++paginas);
                        finDePagina(unWriter, documento);
                    }else{
                        Chapter chap = new Chapter(19);
                        Paragraph titulo = new Paragraph("Estatura para la edad de las niñas", capituloFont);
                        chap.add(titulo);
                        agregarLineaEnBlanco(grafica, 1);
                        Paragraph subTitulo = new Paragraph("Percentiles (5 a 15 años)", subCapituloFont);
                        chap.add(subTitulo);
                        agregarLineaEnBlanco(grafica, 1);
                        // Parámetros de la grafica
                        XYSeriesCollection coleccion = funcionesG.graficaEstatura515Niña();
                        String tituloDominio = "Edad en meses";
                        String tituloRange = "Estatura(cm)";
                        Double rangoDLow = 61.0;
                        Double rangoDUp = 180.0;
                        Double rangoRLow = 100.0;
                        Double rangoRUp = 230.0;
                        // Se crea la grafica con los parametros y se le da formato
                        JFreeChart chart =  funcionesG.crearGrafica(tituloDominio, tituloRange, coleccion);
                        funcionesG.darFormatoTabla(chart, rangoDLow, rangoDUp, rangoRLow, rangoRUp);
                        BufferedImage image =chart.createBufferedImage(450, 400);
                        Image graf = com.itextpdf.text.Image.getInstance(image, null);
                        chap.add(graf);
                        setPercentilesGrafica(chap,"Niña");
                        documento.add(chap);
                        documento.setPageCount(++paginas);
                        finDePagina(unWriter, documento);
                    }
                    break;
                }
                case 6:{
                    if(ninio.isSexo()){
                        Chapter chap = new Chapter(20);
                        Paragraph titulo = new Paragraph("Perímetro cefálico para la edad de los niños", capituloFont);
                        chap.add(titulo);
                        agregarLineaEnBlanco(grafica, 1);
                        Paragraph subTitulo = new Paragraph("Percentiles (nacimiento a 36 meses)", subCapituloFont);
                        chap.add(subTitulo);
                        agregarLineaEnBlanco(grafica, 1);
                        // Parámetros de la grafica
                        XYSeriesCollection coleccion = funcionesG.graficaPcNiño();
                        String tituloDominio = "Edad en meses";
                        String tituloRange = "Perímetro cefálico(cm)";
                        Double rangoDLow = 0.0;
                        Double rangoDUp = 36.0;
                        Double rangoRLow = 32.0;
                        Double rangoRUp = 54.0;
                        // Se crea la grafica con los parametros y se le da formato
                        JFreeChart chart =  funcionesG.crearGrafica(tituloDominio, tituloRange, coleccion);
                        funcionesG.darFormatoTabla(chart, rangoDLow, rangoDUp, rangoRLow, rangoRUp);
                        BufferedImage image =chart.createBufferedImage(450, 400);
                        Image graf = com.itextpdf.text.Image.getInstance(image, null);
                        chap.add(graf);
                        setPercentilesGrafica(chap,"Niño");
                        documento.add(chap);
                        documento.setPageCount(++paginas);
                        finDePagina(unWriter, documento);
                    }else{
                        Chapter chap = new Chapter(20);
                        Paragraph titulo = new Paragraph("Perímetro cefálico para la edad de las niñas", capituloFont);
                        chap.add(titulo);
                        agregarLineaEnBlanco(grafica, 1);
                        Paragraph subTitulo = new Paragraph("Percentiles (nacimiento a 36 meses)", subCapituloFont);
                        chap.add(subTitulo);
                        agregarLineaEnBlanco(grafica, 1);
                        // Parámetros de la grafica
                        XYSeriesCollection coleccion = funcionesG.graficaPcNiña();
                        String tituloDominio = "Edad en meses";
                        String tituloRange = "Perímetro cefálico(cm)";
                        Double rangoDLow = 0.0;
                        Double rangoDUp = 36.0;
                        Double rangoRLow = 32.0;
                        Double rangoRUp = 54.0;
                        // Se crea la grafica con los parametros y se le da formato
                        JFreeChart chart =  funcionesG.crearGrafica(tituloDominio, tituloRange, coleccion);
                        funcionesG.darFormatoTabla(chart, rangoDLow, rangoDUp, rangoRLow, rangoRUp);
                        BufferedImage image =chart.createBufferedImage(450, 400);
                        Image graf = com.itextpdf.text.Image.getInstance(image, null);
                        chap.add(graf);
                        setPercentilesGrafica(chap,"Niña");
                        documento.add(chap);
                        documento.setPageCount(++paginas);
                        finDePagina(unWriter, documento);
                    }
                    break;
                }
                case 7:{
                    if(ninio.isSexo()){
                        Chapter chap = new Chapter(21);
                        Paragraph titulo = new Paragraph("IMC para la edad del niño", capituloFont);
                        chap.add(titulo);
                        agregarLineaEnBlanco(grafica, 1);
                        Paragraph subTitulo = new Paragraph("Percentiles (5 a 15 años)", subCapituloFont);
                        chap.add(subTitulo);
                        agregarLineaEnBlanco(grafica, 1);
                        // Parámetros de la grafica
                        XYSeriesCollection coleccion = funcionesG.graficaImcNiño();
                        String tituloDominio = "Edad en meses";
                        String tituloRange = "IMC(kg/m2)";
                        Double rangoDLow = 60.0;
                        Double rangoDUp = 180.0;
                        Double rangoRLow = 12.0;
                        Double rangoRUp = 28.0;
                        // Se crea la grafica con los parametros y se le da formato
                        JFreeChart chart =  funcionesG.crearGrafica(tituloDominio, tituloRange, coleccion);
                        funcionesG.darFormatoTabla(chart, rangoDLow, rangoDUp, rangoRLow, rangoRUp);
                        BufferedImage image =chart.createBufferedImage(450, 400);
                        Image img = Image.getInstance(unWriter, image, 1.0f);
                        chap.add(img);
                        setPercentilesGrafica(chap,"Niño");
                        documento.add(chap);
                        documento.setPageCount(++paginas);
                        finDePagina(unWriter, documento);
                    }else{
                        Chapter chap = new Chapter(21);
                        Paragraph titulo = new Paragraph("IMC para la edad de la niña", capituloFont);
                        chap.add(titulo);
                        agregarLineaEnBlanco(grafica, 1);
                        Paragraph subTitulo = new Paragraph("Percentiles (5 a 15 años)", subCapituloFont);
                        chap.add(subTitulo);
                        agregarLineaEnBlanco(grafica, 1);
                        // Parámetros de la grafica
                        XYSeriesCollection coleccion = funcionesG.graficaImcNiña();
                        String tituloDominio = "Edad en meses";
                        String tituloRange = "IMC(kg/m2)";
                        Double rangoDLow = 60.0;
                        Double rangoDUp = 180.0;
                        Double rangoRLow = 12.0;
                        Double rangoRUp = 28.0;
                        // Se crea la grafica con los parametros y se le da formato
                        JFreeChart chart =  funcionesG.crearGrafica(tituloDominio, tituloRange, coleccion);
                        funcionesG.darFormatoTabla(chart, rangoDLow, rangoDUp, rangoRLow, rangoRUp);
                        BufferedImage image =chart.createBufferedImage(450, 400);
                        Image img = Image.getInstance(unWriter, image, 1.0f);
                        chap.add(img);
                        setPercentilesGrafica(chap,"Niña");
                        documento.add(chap);
                        documento.setPageCount(++paginas);
                        finDePagina(unWriter, documento);
                    }
                    break;
                }
            } 
        }
    }
    
    private static void agregarLineaEnBlanco(Paragraph parrafo, int number) {
        for (int i = 0; i < number; i++) {
            parrafo.add(new Paragraph(" "));
        }
    }
    
    public PdfPTable agregarCeldasVaciasATabla(PdfPTable unaTabla, int cantidad){
        for (int i = 1; i <= cantidad; i++){
            agregarCeldaATabla(unaTabla,"");
        }
        return unaTabla;
    }
    
    public PdfPTable agregarCeldaATabla(PdfPTable unaTabla, String dato){
        PdfPCell celda = new PdfPCell(new Phrase(dato, chicaFont));
        celda.setHorizontalAlignment(Element.ALIGN_LEFT);
        unaTabla.addCell(celda);
        return unaTabla;
    }
    
    //Agrega una celda a una tabla con el texto alineado a la izquierda
    public void agregarCeldaTablaIzq(PdfPTable unaTabla, String dato){
        PdfPCell celda = new PdfPCell(new Phrase(dato, chicaFont));
        celda.setHorizontalAlignment(Element.ALIGN_LEFT);
        unaTabla.addCell(celda);
    }
    
    //Agrega una celda a una tabla con el texto centrado
    public void agregarCeldaTablaCent(PdfPTable unaTabla, String dato){
        PdfPCell celda = new PdfPCell(new Phrase(dato, chicaFont));
        celda.setHorizontalAlignment(Element.ALIGN_CENTER);
        unaTabla.addCell(celda);
    }
    
    //Agrega una celda seteando el fondo de acuerdo al sexo
    //y agregando texto centrado si se cumple una condición
    public void agregarCeldaTablaVacunas(PdfPTable unaTabla, String dato, boolean cierto){
        PdfPCell celda = new PdfPCell(new Phrase(""));
        celda.setBackgroundColor(seteaFondoCeldaDato());
        if(cierto){
            celda.setPhrase(new Phrase(dato, chicaFont));
            celda.setHorizontalAlignment(Element.ALIGN_CENTER);
        } 
        unaTabla.addCell(celda);
    }
    
    //Agrega una celda c/datos seteando el fondo de acuerdo al sexo
    //y agregando texto centrado 
    public void agregarCeldaDatoCentColor(PdfPTable unaTabla, String dato){
        PdfPCell celda = new PdfPCell(new Phrase(dato, chicaFont));
        celda.setBackgroundColor(seteaFondoCeldaDato());
        celda.setHorizontalAlignment(Element.ALIGN_CENTER);
        unaTabla.addCell(celda);
    }
    
    //Agrega una celda c/datos seteando el fondo de acuerdo al sexo
    //y agregando texto centrado 
    public void agregarCeldaDatoCentColorChica(PdfPTable unaTabla, String dato){
        PdfPCell celda = new PdfPCell(new Phrase(dato, masChicaFont));
        celda.setBackgroundColor(seteaFondoCeldaDato());
        celda.setHorizontalAlignment(Element.ALIGN_CENTER);
        unaTabla.addCell(celda);
    }
    
    //Agrega una celda c/datos seteando el fondo de acuerdo al sexo
    //y agregando texto centrado 
    public void agregarCeldaDatoIzqColor(PdfPTable unaTabla, String dato){
        PdfPCell celda = new PdfPCell(new Phrase(dato, chicaFont));
        celda.setBackgroundColor(seteaFondoCeldaDato());
        celda.setHorizontalAlignment(Element.ALIGN_LEFT);
        unaTabla.addCell(celda);
    }
    //Agrega una celda c/titulos seteando el fondo de acuerdo al sexo
    //y agregando texto centrado 
    public void agregarCeldaTitCentColor(PdfPTable unaTabla, String dato){
        PdfPCell celda = new PdfPCell(new Phrase(dato, chicaFont));
        celda.setBackgroundColor(seteaFondoCeldaTit());
        celda.setHorizontalAlignment(Element.ALIGN_CENTER);
        unaTabla.addCell(celda);
    }
    
    //Agrega una celda c/titulos seteando el fondo de acuerdo al sexo
    //y agregando texto centrado 
    public void agregarCeldaTitIzqColor(PdfPTable unaTabla, String dato){
        PdfPCell celda = new PdfPCell(new Phrase(dato, chicaFont));
        celda.setBackgroundColor(seteaFondoCeldaTit());
        celda.setHorizontalAlignment(Element.ALIGN_LEFT);
        unaTabla.addCell(celda);
    }
    
    public BaseColor seteaFondoCeldaDato (){
        BaseColor verde = new BaseColor(189,253,153);
        BaseColor amarillo = new BaseColor(255,204,153);
        if (ninio.isSexo())
            return verde;
        else
            return amarillo;
    }
    
    public BaseColor seteaFondoCeldaTit (){
        BaseColor verde = new BaseColor(153,204,0);
        BaseColor amarillo = new BaseColor(255,153,0);
        if (ninio.isSexo())
            return verde;
        else
            return amarillo;
    }
    
    /**
     * Inserta el numero de pagina la final de la pagina.
     * @param writer
     * @param documento Documento de donde se obtienen ciertos parametros.  
     */
    public void finDePagina(PdfWriter writer, Document documento) {

        try {
            Rectangle pagina = documento.getPageSize();
            PdfPTable tablaPie = getPieDePagina(documento);
            // Se calcula el ancho total de la pagina del documeto
            float f = pagina.getWidth() - documento.leftMargin() - documento.rightMargin();
            // Se setea el ancho total a la tablaPie
            tablaPie.setTotalWidth(f);
            // Este metodo setea el lugar donde se debe imprimir la tablaPie 
            tablaPie.writeSelectedRows(0, -1, documento.leftMargin(), documento.bottomMargin() + 20, writer.getDirectContent());
        } catch (DocumentException e) {
        }
    }
    
    /**
     * Crea una tabla con el numero de pagina.
     * @param documento De donde se obtiene el numero de pagina.
     * @return          Una PdfTable que contiene el numero de pagina.
     */
    private PdfPTable getPieDePagina(Document documento) throws DocumentException {
        Font pieFont = FontFactory.getFont(FontFactory.HELVETICA, 9);
        PdfPTable tablaPie = new PdfPTable(1);
        tablaPie.setWidthPercentage (10.0f);
        tablaPie.getDefaultCell().setPadding(2);
        tablaPie.getDefaultCell().setBorderWidth(0);
        tablaPie.getDefaultCell().setHorizontalAlignment(Element.ALIGN_RIGHT);
        tablaPie.addCell(new Phrase(Integer.toString(documento.getPageNumber()), pieFont));
        
        return tablaPie;
    }
    /**
     * Crea una tabla con el color y la leyenda recibidas por parametro
     * @param color 
     * @param leyenda
     * @return 
     */
    private PdfPTable getLeyendaGrafica(BaseColor color, String leyenda){
        PdfPTable tabla = new PdfPTable(new float []{0.1f, 3.0f});
        tabla.getDefaultCell().setBorderWidth(0);
        tabla.setWidthPercentage (80.0f);
        PdfPCell c1 = new PdfPCell();
        c1.setBackgroundColor(color);
        c1.setBorder(0);
        PdfPCell c2 = new PdfPCell();
        c2.setBorder(0);
        c2.setPhrase(new Phrase("  "+leyenda, chicaFont));
        tabla.addCell(c1);
        tabla.addCell(c2);
        return tabla;
    }
    
    /**
     * Agrega la leyenda a una grafica
     * @param chap Capitulo al que se agrega la leyenda
     */
    private void setPercentilesGrafica(Chapter chap, String genero){
        Paragraph linea = new Paragraph(" ");
        chap.add(getLeyendaGrafica(new BaseColor(102,102,255), genero));
        chap.add(linea);
        chap.add(getLeyendaGrafica(new BaseColor(204,51,0), "Percentil 97 - Cuidado"));
        chap.add(linea);
        chap.add(getLeyendaGrafica(new BaseColor(255,153,0), "Percentil 85 - Atención"));
        chap.add(linea);
        chap.add(getLeyendaGrafica(new BaseColor(0,153,0), "Percentil 50 - Optimo"));
        chap.add(linea);
        chap.add(getLeyendaGrafica(new BaseColor(255,153,0), "Percentil 15 - Atención"));
        chap.add(linea);
        chap.add(getLeyendaGrafica(new BaseColor(204,51,0), "Percentil 3 - Cuidado"));
    }
    
}


